package object2;

/**
 * 动态绑定机制
 */
public class DynamicBinding {

    public static void main(String[] args) {
        //向上转型,da编译类型 Da,运行类型Db
        Da da = new Db();
        System.out.println(da.sum());//运行类型Db,访问它的sum() 返回40 ;如果注销子类的sum()，当执行到父类sum()时，getI()调用的是da的运行类型即Db的getI()，所以返回20 + 10 = 30
        System.out.println(da.sum1());//运行类型Db,访问它的sum1() 返回30;如果注销子类的sum1()，当执行到父类sum1()时，直接返回 20
    }
}

class Da{

    public int i = 10;

    //动态绑定机制
    //当调用对象方法的时候，该方法会和该对象的内存地址/运行类型绑定
    //当调用对象属性时，没有动态绑定机制，哪里声明哪里使用
    public int sum(){//父类sum()
        return getI() + 10;
    }

    public int sum1(){//父类 sum1()
        return i + 10;
    }

    public int getI(){
        return i;
    }
}

class Db extends Da{

    public int i = 20;

//    public int sum(){
//        return i + 20;
//    }

    public int getI(){//子类 getI()
        return i;
    }

//    public int sum1(){
//        return i + 10;
//    }

}